package proyecto2.src.controles;


import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.HashMap;
import java.util.Vector;

import proyecto2.src.aplicacion.Juego;
import proyecto2.src.entidades.Principal;
import proyecto2.src.entidades.nave;


public class ControlTecladoPrincipal implements KeyListener {

	protected Juego juego;
	protected HashMap<Integer, String> mapeoTeclado;
	protected Principal nave;
	protected Vector<Integer> teclasActuales;

	public ControlTecladoPrincipal(Juego j) {
		juego = j;		
		mapeoTeclado = new HashMap<Integer, String>();
		teclasActuales = new Vector<Integer>();
		inicializarHash();
	}

	public nave getNave() {
		return nave;
	}


	public void setNave(Principal nave) {
		this.nave = nave;
	}

	//mapeo pensado en agregar la posibildad de cambiar los controles a conveniencia del usuario
	private void inicializarHash() {
		mapeoTeclado.put(KeyEvent.VK_UP, "avanzar");
		mapeoTeclado.put(KeyEvent.VK_DOWN, "retroceder");
		mapeoTeclado.put(KeyEvent.VK_LEFT, "izquierda");
		mapeoTeclado.put(KeyEvent.VK_RIGHT, "derecha");
		mapeoTeclado.put(KeyEvent.VK_Z, "principal");
		mapeoTeclado.put(KeyEvent.VK_X, "secundario");
		mapeoTeclado.put(KeyEvent.VK_C, "habilidad");
		mapeoTeclado.put(KeyEvent.VK_V, "devastadora");		
		mapeoTeclado.put(KeyEvent.VK_R, "reiniciar");	
	}


	private void procesarTeclas() {
		int factor = nave.getVelocidad();
		int posX = nave.getX();
		int posY = nave.getY();
		int dX = posX;
		int dY = posY;

		for (Integer e : teclasActuales) {

			String str = mapeoTeclado.get(e);

			if (str != null) {

				switch(str) {
				case "avanzar": {
					if (posY >= 0) {
						dY -= factor;
					}
					break;
				}
				case "retroceder": {
					if (posY <= juego.getHeight()-nave.getHeight()*2) {  //extrañamente parece que la altura de la ventana no es 500
						dY += factor;
					}
					break;
				}
				case "izquierda": {
					if (posX >= 0) {
						dX -= factor;
					}
					break;
				}
				case "derecha": {
					if (posX <= juego.getWidth()-nave.getWidth()) {
						dX += factor;
					}
					break;
				}	
				case "habilidad": {
					nave.disparar(3);
					break;
				}
				case "principal":{	
					nave.disparar(1);
					break;
				}
				case "devastadora":{
					nave.disparar(4);
					break;
				}
				case "secundario":{
					nave.disparar(2);
					break;
				}
				case "reiniciar":{
					juego.reinicio();
					break;
				}
				}
			}
		}	//endFor
		nave.setLocation(dX, dY);
	}

	@Override
	public void keyReleased(KeyEvent e) {
		Integer valor = e.getKeyCode();
		teclasActuales.remove(valor);
	}

	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void keyPressed(KeyEvent e) {
		if (!teclasActuales.contains(e.getKeyCode())) {
			teclasActuales.add(e.getKeyCode());
		}
		procesarTeclas();
	}

}
